package com.xszx.knowledge.handler;

import com.xszx.knowledge.exception.DevException;
import com.xszx.knowledge.util.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 统一异常处理、数据预处理等
 */
@ControllerAdvice
public class ControllerExceptionHandler {

    private static final Logger LOG = LoggerFactory.getLogger(ControllerExceptionHandler.class);

    /**
     * 校验异常统一处理
     *
     * @param e
     * @return
     */
    @ExceptionHandler(value = BindException.class)
    @ResponseBody
    public Result validExceptionHandler(BindException e) {
        LOG.warn("参数校验失败：{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        return Result.error().message(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
    }
    /**
     * 校验自定义异常统一处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = DevException.class)
    @ResponseBody
    public Result validExceptionHandler(DevException e) {
        LOG.warn("业务异常：{}", e.getCode().getDesc());
        return Result.error().message(e.getCode().getDesc());
    }

    /**
     * 校验异常统一处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result validExceptionHandler(Exception e) {
        LOG.error("系统异常：", e);
        return Result.error().message("系统出现异常，请联系管理员");
    }

    /**
     * 数据校验全局处理
     * MethodArgumentNotValidException是@RequestBody和@Validated配合时产生的异常，比如在传参时如果前端的json数据里部分缺失@RequestBody修饰的实体类的属性就会产生这个异常。
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseBody
    public Result MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e)
    {
        LOG.warn("参数校验失败：{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        return Result.error().message(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
    }
}
